#include <cstdio>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include "xerelease.hh"
#include "xeapi.hh"

static json data1;

// typedef void(*LP)(struct tm *local);//define a  pointer function
#define MAX_PATH 260
static const int longterm_year = 2019, longterm_month = 1, longterm_day = 11;
static const int stable_year = 2017, stable_month = 5, stable_day = 19;
static const int develop_year = 2017, develop_month = 5, develop_day = 19;

int total_day(int year, int month, int day)
{
    // Calculate day of 1 year
    int sum = 0;
    switch (month)
    {
    case 1:
        sum = day;
        break;
    case 2:
        sum = day + 31;
        break;
    case 3:
        sum = day + 59;
        break;
    case 4:
        sum = day + 90;
        break;
    case 5:
        sum = day + 120;
        break;
    case 6:
        sum = day + 151;
        break;
    case 7:
        sum = day + 181;
        break;
    case 8:
        sum = day + 212;
        break;
    case 9:
        sum = day + 243;
        break;
    case 10:
        sum = day + 273;
        break;
    case 11:
        sum = day + 304;
        break;
    case 12:
        sum = day + 334;
        break;
    default:
        printf("Date Wrong!");
    }
    if (year % 4 == 0 && year % 100 != 0 && month > 2)
        sum = sum + 1;
    return sum;
}

int total_year_day(int year1, int year2)
{
    // Calculate day of years
    int sum = 0;
    sum = (year2 - year1) * 365;
    for (int i = year1; i < year2; i++)
    {
        if (i % 4 == 0 && i % 100 != 0)
        {
            sum = sum + 1;
        }
    }
    return sum;
}

static void path_translate(char *result, const char *version)
{
    if (!data1.empty())
    {
        // Just combine the release file path and filename
        std::string path;

        // Get the major version number
        std::string tmp_str = std::string(version);
        size_t pos = tmp_str.find_first_of(".");
        std::string version_major = tmp_str.substr(0, pos);
        switch (get_os_type())
        {
        case OS_Type::Linux:
            path = data1["Release_Path_Unix"];
            snprintf(result, 57, "%s/xe-%s.x", path.c_str(), version_major.c_str());
            break;
        case OS_Type::Darwin:
            path = data1["Release_Path_Darwin"];
            snprintf(result, 57, "%s/xe-%s.x", path.c_str(), version_major.c_str());
            break;
        case OS_Type::Windows:
            path = data1["Release_Path_Win32"];
            snprintf(result, 57, "%s\\xe-%s.x", path.c_str(), version_major.c_str());
            break;
        }
        // if (rel_unix_file_system_detected())
        // {
        //     path = data1["Release_Path_Unix"];
        //     sprintf(result, "%s/xe-%c.x", path.c_str(), version[0]);
        // }
        // else
        // {
        //     path = data1["Release_Path_Win32"];
        //     sprintf(result, "%s\\xe-%c.x", path.c_str(), version[0]);
        // }
    }
    else
    {
        snprintf(result, 57, "./xe-%c.x", version[0]);
    }
}

void get_release_str(struct tm *local, const XeVer &version1, char *callback_str)
{
    // Print Version of release mode 1 in the file
    char filename[MAX_PATH];
    path_translate(filename, version1.version);
    // sprintf(filename, "xe-%c.x", lts[0]);
    int lts_ver = 0; // default release version
    int year2 = local->tm_year + 1900,
        month2 = local->tm_mon + 1, day2 = local->tm_mday;
    // get release version
    lts_ver = total_year_day(version1.year, year2) -
              total_day(version1.year, version1.month, version1.day) +
              total_day(year2, month2, day2);
    // For show in dialog or console
    snprintf(callback_str, 57, "Xeinit %s version:%s.%d\n",
             version1.branch, version1.version, lts_ver);
    freopen(filename, "a", stdout);
    // put all output in the release file
    // output:release branch time in xe-release
    printf("%4d-%02d-%02d ", local->tm_year + 1900, local->tm_mon + 1, local->tm_mday);
    printf("%s.%d Api:%d\n", version1.version, lts_ver, xeapi1(local));
    fclose(stdout);
    return;
}

void json_config_init(json &user_data)
{
    data1 = user_data;
}

// These code just for archive
// 2020-2023 Xe Release 1.0 to 16.1

// void dale(struct tm *local)
// {
//     printf("xeinit release maker by dale\n");
// }

// void longterm(struct tm *local, const char *lts, char *str)
// {
//     // Print Version of longterm release in the file
//     char filename[MAX_PATH];
//     path_translate(filename, lts);
//     // sprintf(filename, "xe-%c.x", lts[0]);
//     int lts_ver = 0; // default release version
//     int year2 = local->tm_year + 1900,
//         month2 = local->tm_mon + 1, day2 = local->tm_mday;
//     // get release version
//     lts_ver = total_year_day(longterm_year, year2) -
//               total_day(longterm_year, longterm_month, longterm_day) +
//               total_day(year2, month2, day2);
//     // For show in dialog or console
//     snprintf(str, 57, "Xeinit LTS version:%s.%d\n", lts, lts_ver);
//     freopen(filename, "a", stdout);
//     // put all output in the release file
//     // output:release branch time in xe-release
//     printf("%4d-%02d-%02d ", local->tm_year + 1900, local->tm_mon + 1, local->tm_mday);
//     printf("%s.%d Api:%d\n", lts, lts_ver, xeapi1(local));
//     fclose(stdout);
//     return;
// }

// void stable(struct tm *local, const char *rel, char *str)
// {
//     // Print Version of stable release in the file
//     char filename[57];
//     path_translate(filename, rel);
//     // sprintf(filename, "xe-%c.x", rel[0]);
//     int devel1; // stable release version
//     int year2 = local->tm_year + 1900,
//         month2 = local->tm_mon + 1, day2 = local->tm_mday;
//     // get release version
//     devel1 = total_year_day(stable_year, year2) -
//              total_day(stable_year, stable_month, stable_day) +
//              total_day(year2, month2, day2);
//     snprintf(str, 57, "Xeinit stable Version:%s.%d\n", rel, devel1);
//     freopen(filename, "a", stdout);
//     // put all output in the release file
//     // output:development branch time in xe-release
//     printf("%4d-%02d-%02d ", local->tm_year + 1900, local->tm_mon + 1, local->tm_mday);
//     printf("%s.%d build:%d\n", rel, devel1, xeapi1(local));
//     fclose(stdout);
//     return;
// }

// void develop(struct tm *local, const char *devel, char *str)
// {
//     // Print Version of develop release in the file
//     char filename[57];
//     path_translate(filename, devel);
//     // sprintf(filename, "xe-%c.x", devel[0]);
//     int devel1; // development version
//     int year2 = local->tm_year + 1900,
//         month2 = local->tm_mon + 1, day2 = local->tm_mday;
//     // get release version
//     devel1 = total_year_day(develop_year, year2) -
//              total_day(develop_year, develop_month, develop_day) +
//              total_day(year2, month2, day2);
//     snprintf(str, 57, "Xeinit devel Version:%s.%d\n", devel, devel1);
//     freopen(filename, "a", stdout);
//     // put all output in the release file
//     // output:development branch time in xe-release
//     printf("%4d-%02d-%02d ", local->tm_year + 1900, local->tm_mon + 1, local->tm_mday);
//     printf("%s.%d build:%d\n", devel, devel1, xeapi1(local));
//     fclose(stdout);
//     return;
// }
